#include "bsp_gpio.h"
#include "at32f403a_407_crm.h"
#include "at32f403a_407_gpio.h"
#include "cbb_init.h" 
#include <stdint.h>

// LCD PINS
#define TFT_LCD_CS_PIN  GPIO_PINS_13
#define TFT_LCD_CS_PORT GPIOB

#define TFT_LCD_RST_PIN GPIO_PINS_12
#define TFT_LCD_RST_PORT GPIOB

#define TFT_LCD_DC_PIN  GPIO_PINS_1
#define TFT_LCD_DC_PORT GPIOB

#define TFT_LCD_BLK_PIN  GPIO_PINS_0
#define TFT_LCD_BLK_PORT GPIOB

// BUTTON PINS
#define BUTTON_1_PIN    GPIO_PINS_0
#define BUTTON_1_PORT   GPIOA

#define BUTTON_2_PIN    GPIO_PINS_1
#define BUTTON_2_PORT   GPIOA

#define BUTTON_3_PIN    GPIO_PINS_2
#define BUTTON_3_PORT   GPIOA

#define BUTTON_4_PIN    GPIO_PINS_3
#define BUTTON_4_PORT   GPIOA

#define BUTTON_5_PIN    GPIO_PINS_3
#define BUTTON_5_PORT   GPIOA

// BEEP PINS
#define BEEP_PIN        GPIO_PINS_14
#define BEEP_PORT       GPIOC

// SC7A20H PINS
#define SC7A20H_INT1_PIN  GPIO_PINS_5
#define SC7A20H_INT1_PORT GPIOA

#define SC7A20H_INT2_PIN  GPIO_PINS_6
#define SC7A20H_INT2_PORT GPIOA

void bsp_gpio_init(void)
{
    // 使能时钟
    crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK,TRUE);
    crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK,TRUE);
    crm_periph_clock_enable(CRM_GPIOC_PERIPH_CLOCK,TRUE);
    crm_periph_clock_enable(CRM_GPIOD_PERIPH_CLOCK,TRUE);
    crm_periph_clock_enable(CRM_GPIOE_PERIPH_CLOCK,TRUE);

    gpio_init_type gpio_init_struct;

    // Configure LCD pins
    gpio_init_struct.gpio_pins = TFT_LCD_CS_PIN;
    gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
    gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
    gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
    gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_MODERATE;
    gpio_init(TFT_LCD_CS_PORT, &gpio_init_struct);

    gpio_init_struct.gpio_pins = TFT_LCD_RST_PIN;
    gpio_init(TFT_LCD_RST_PORT, &gpio_init_struct);

    gpio_init_struct.gpio_pins = TFT_LCD_RST_PIN;
    gpio_init(TFT_LCD_RST_PORT, &gpio_init_struct);

    gpio_init_struct.gpio_pins = TFT_LCD_DC_PIN;
    gpio_init(TFT_LCD_DC_PORT, &gpio_init_struct);

    gpio_init_struct.gpio_pins = TFT_LCD_BLK_PIN;
    gpio_init(TFT_LCD_BLK_PORT, &gpio_init_struct);

    // 配置BEEP
    gpio_init_struct.gpio_pins = BEEP_PIN;
    gpio_init(BEEP_PORT, &gpio_init_struct);

    // Configure button pins
    gpio_init_struct.gpio_pins = BUTTON_1_PIN;
    gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;
    gpio_init_struct.gpio_pull = GPIO_PULL_UP;
    gpio_init(BUTTON_1_PORT, &gpio_init_struct);

    gpio_init_struct.gpio_pins = BUTTON_2_PIN;
    gpio_init(BUTTON_2_PORT, &gpio_init_struct);

    gpio_init_struct.gpio_pins = BUTTON_3_PIN;
    gpio_init(BUTTON_3_PORT, &gpio_init_struct);

    gpio_init_struct.gpio_pins = BUTTON_4_PIN;
    gpio_init(BUTTON_4_PORT, &gpio_init_struct);

    gpio_init_struct.gpio_pins = BUTTON_5_PIN;
    gpio_init(BUTTON_5_PORT, &gpio_init_struct);

    // Configure SC7A20H pins
    gpio_init_struct.gpio_pins = SC7A20H_INT1_PIN;
    gpio_init(SC7A20H_INT1_PORT, &gpio_init_struct);

    gpio_init_struct.gpio_pins = SC7A20H_INT2_PIN;
    gpio_init(SC7A20H_INT2_PORT, &gpio_init_struct);

    // Configure other pins
}
INIT_PORT_BSP(bsp_gpio_init);

void bsp_lcd_cs_write(uint8_t value)
{
    gpio_bits_write(TFT_LCD_CS_PORT, TFT_LCD_CS_PIN, value);
}

void bsp_lcd_rst_write(uint8_t value)
{
    gpio_bits_write(TFT_LCD_RST_PORT, TFT_LCD_RST_PIN, value);
}

void bsp_lcd_dc_write(uint8_t value)
{
    gpio_bits_write(TFT_LCD_DC_PORT, TFT_LCD_DC_PIN, value);
}

void bsp_lcd_blk_write(uint8_t value)
{
    gpio_bits_write(TFT_LCD_BLK_PORT, TFT_LCD_BLK_PIN, value);
}

void bsp_beep_write(uint8_t value)
{
    gpio_bits_write(BEEP_PORT, BEEP_PIN, value);
}

uint8_t bsp_button_1_read(void)
{
    return gpio_input_data_bit_read(BUTTON_1_PORT, BUTTON_1_PIN);
}

uint8_t bsp_button_2_read(void)
{
    return gpio_input_data_bit_read(BUTTON_2_PORT, BUTTON_2_PIN);
}

uint8_t bsp_button_3_read(void)
{
    return gpio_input_data_bit_read(BUTTON_3_PORT, BUTTON_3_PIN);
}

uint8_t bsp_button_4_read(void)
{
    return gpio_input_data_bit_read(BUTTON_4_PORT, BUTTON_4_PIN);
}

uint8_t bsp_button_5_read(void)
{
    return gpio_input_data_bit_read(BUTTON_5_PORT, BUTTON_5_PIN);
}

uint8_t bsp_sc7a20h_int1_read(void)
{
    return gpio_input_data_bit_read(SC7A20H_INT1_PORT, SC7A20H_INT1_PIN);
}

uint8_t bsp_sc7a20h_int2_read(void)
{
    return gpio_input_data_bit_read(SC7A20H_INT2_PORT, SC7A20H_INT2_PIN);
}

